<?php
/*
 * Author : Pragash Jeyaratnam
 * Vector Class
 * PHP Version 5.2.5
 * Contact : pragash_jey@yahoo.com.
 */
class Vector {
    /*
     * The number of valid components in this Vector object.
     */
    protected $elementCount;

    /*
     * The array buffer into which the components of the vector are stored.
     */
    protected $elementData;

    /**Default vector Constructor*/
    function __construct() {
        $this->elementData = array();
        $this->elementCount = count($this->elementData);
    }

    /**Append the parameter element to the vector*/
    public function add($object) {
        if(!empty($object)) {
            $this->elementData[] = $object;
            $this->elementCount = count($this->elementData);
            return true;
        }
        else
            return false;
    }
   
    /*
     * Returns true of Vector is empty false otherwise
     */
    public function isEmpty() {
        return($this->elementCount==0);
    }

    /*
     * Returns the current size of this Vector
     */
    public function size() {
    	return $this->elementCount;
    }
   
   /*
    *  Searches for the first occurence of the given argument
    **/
   public function indexOf($object)
   {
          if(($index =array_search($object,$this->elementData)) !==false)
              return $index;
          else
              return -1;
   }
  
   /*
    * This function will retain TRUE if $object is contained
    * within the vector else FALSE
    */
  
   public function contains($object)
   {
           return ($this->indexOf($object)>=0);
   }
   
   /*
    * Returns Vector Object at index $index
    * Error : Null is returned
    */
     
   public function get($index)
   {
           if($this->checkBound($index))
           {
               return ($this->elementData[$index]);
           }
           return NULL;
   }
  
   /*
    * Sets the object at $index to be $object
    **/
  
   public function set($index,$object)
   {
           if($this->checkBound($index))
           {
               $this->elementData[$index] =$object ;
               return true;
           }
           return false;
   }
  
  /*
   * Removes element at $index
   **/
  
      public function removeAt($index)
      {
       if ($this->checkBound($index))
           {
                 for ($i = $index; $i != $this->elementCount - 1; $i++)
                  {
                   $this->elementData[$i] = $this->elementData[$i +1];
             }
       array_pop($this->elementData);
       $this->elementCount = count($this->elementData);
           
       return true;
       }
       else {
            return false;
            }
      }
   
    /**
     * Removes all elements from the Vector.  Note that this does not
     * resize the internal data array.
     */
   public function removeAll()
   {
         if($this->elementCount ==0)
             return;
         for($i=0;$i<$this->size();$i++)
         {
             $this->set($i,NULL);
         }
   }
   
   
   /*
    * This function checks whether index
    * is within the array bound
    **/
  
   private function checkBound($index)
   {
         if($index > $this->elementCount-1 || $index < 0)
         {
             throw new Exception('Array Index Out Of Bound Exception');
             return false;
         }
         return true;
   }
  
    /*
     *Removes the first element from the Vector
     */
   
    public function removeFirstElement()
    {
        if($this->elementCount==0)
        {
            throw new Exception('No Such Element');
        }
        $test =array_shift($this->elementData);
        if(!empty($test))
            $this->elementCount = count($this->elementData);
    }
  
}
?>